package com.gxcc3.ygps.common.utils.uuid;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * ID生成器工具类
 * 
 * @author ruoyi
 */
public class IdUtils
{
    /**
     * 获取随机UUID
     * 
     * @return 随机UUID
     */
    public static String randomUUID()
    {
        return UUID.randomUUID().toString();
    }

    /**
     * 简化的UUID，去掉了横线
     * 
     * @return 简化的UUID，去掉了横线
     */
    public static String simpleUUID()
    {
        return UUID.randomUUID().toString(true);
    }

    /**
     * 获取随机UUID，使用性能更好的ThreadLocalRandom生成UUID
     * 
     * @return 随机UUID
     */
    public static String fastUUID()
    {
        return UUID.fastUUID().toString();
    }

    /**
     * 简化的UUID，去掉了横线，使用性能更好的ThreadLocalRandom生成UUID
     * 
     * @return 简化的UUID，去掉了横线
     */
    public static String fastSimpleUUID()
    {
        return UUID.fastUUID().toString(true);
    }



    // 静态全局实例
    private static final SnowflakeIdUtil idWorker = new SnowflakeIdUtil(1, 1);
    /**
     * 使用雪花算法生id
     * @return 使用雪花算法生成的id
     */
    public static String randomSnowId(){
        return String.valueOf(idWorker.nextId());
    }



    /**
     * 生成系统内唯一采样编号
     * @return 采样编号
     */
    public static String randomSampleNo(){
        return generate("","");
    }


    public static void main(String[] args) throws InterruptedException {
        for (int i = 0; i < 10; i++) {
            System.err.println(simpleUUID());
        }
    }

    // 用于生成序列号，防止同一毫秒内重复
    private static final AtomicInteger COUNTER = new AtomicInteger(0);
    private static final int MAX_PER_MILLIS = 999; // 每毫秒最多生成1000个编号
    private static final ThreadLocal<SimpleDateFormat> FORMATTER = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyyMMddHHmmssSSS"));


    /**
     * 生成唯一编号
     *
     * @param prefix 可选前缀，比如 "ORD"（订单）
     * @param suffix 可选后缀，比如 "A01"（系统标识）
     * @return 唯一编号
     */
    public static synchronized String generate(String prefix, String suffix) {
        String timestamp = FORMATTER.get().format(new Date());

        // 保证同一毫秒内也不重复
        int count = COUNTER.getAndIncrement();
        if (count > MAX_PER_MILLIS) {
            // 如果超出最大值，阻塞等待下一毫秒
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            count = COUNTER.getAndSet(0);
            timestamp = FORMATTER.get().format(new Date());
        }

        String seq = String.format("%03d", count); // 固定3位序列号
        StringBuilder sb = new StringBuilder();

        if (prefix != null && !prefix.isEmpty()) {
            sb.append(prefix);
        }
        sb.append(timestamp).append(seq);
        if (suffix != null && !suffix.isEmpty()) {
            sb.append(suffix);
        }
        return sb.toString();
    }




}
